# =================================================================
# 第一阶段：构建阶段
# -----------------------------------------------------------------
# 优化点：
# 1. 使用 COPY 替代 ADD，语义更清晰。
# 2. 优化 COPY 顺序，先复制 pom.xml，利用 Docker 层缓存加速依赖下载。
# 3. 合并 RUN 指令，减少镜像层数。
# =================================================================

# 使用你的自定义 Maven 基础镜像
#本地镜像
#FROM maven-3.8.6-openjdk-17-openeuler-25:1.0.0 AS builder
#dockerhub镜像
#FROM ting567/maven-3.8.6-openjdk-17-openeuler-25:1.0.0 AS builder
#腾讯云镜像
FROM ccr.ccs.tencentyun.com/ting567/maven-3.8.6-openjdk-17-openeuler-25:1.0.0 AS builder

# 创建临时文件
RUN mkdir -p /build

# 将所有必要的模块复制到临时目录
ADD typhoon-admin /build/typhoon-admin
ADD typhoon-common /build/typhoon-common
ADD typhoon-api /build/typhoon-api

# 将pom文件复制到临时目录
ADD pom.xml /build

# 将settings.xml文件复制到临时目录
ADD settings.xml /build

# 验证所有必要文件都存在
RUN cd /build && \
    echo "=== 验证文件结构 ===" && \
    ls -la && \
    test -f pom.xml && echo "✓ pom.xml found" || (echo "✗ pom.xml missing" && exit 1) && \
    test -f settings.xml && echo "✓ settings.xml found" || (echo "✗ settings.xml missing" && exit 1) && \
    test -d typhoon-common && echo "✓ typhoon-common found" || (echo "✗ typhoon-common missing" && exit 1) && \
    test -d typhoon-api && echo "✓ typhoon-api found" || (echo "✗ typhoon-api missing" && exit 1)

# 将项目打成jar包
RUN cd /build && \
    echo "=== 开始Maven构建 ===" && \
    mvn -B -e -Dmaven.test.skip=true -T 1C package -s settings.xml && \
    echo "=== 验证构建产物 ===" && \
    ls -la typhoon-api/target/ && \
    test -f typhoon-api/target/typhoon-api.jar && \
    echo "✓ 主应用jar文件构建成功" || (echo "✗ 主应用jar文件构建失败" && exit 1)

################################################################
# 第二阶段：运行阶段
# -----------------------------------------------------------------
# 优化点：
# 1. 合并所有系统配置 RUN 指令。
# 2. 使用更简洁的方式创建用户和目录。
# 3. 使用 USER 指令，确保应用以非 root 用户运行。
# 4. 复制独立的启动脚本，而非在 Dockerfile 中生成。
# 5. 添加 HEALTHCHECK 进行健康检查。
# =================================================================

# 使用你的自定义 JRE 基础镜像
#本地镜像
#FROM openjdk-17-openeuler-25:1.0.0
#dockerhub镜像
#FROM ting567/openjdk-17-openeuler-25:1.0.0
#腾讯云镜像
FROM ccr.ccs.tencentyun.com/ting567/openjdk-17-openeuler-25:1.0.0

# 设置环境变量
ENV LANG=en_US.UTF-8
ENV TZ=Asia/Shanghai

# 优化：合并所有系统初始化操作到一个 RUN 层，减小镜像体积
RUN \
    # 创建应用所需目录
    mkdir -p /data/run /data/log /data/temp /home/omadmin/program && \
    # 创建 omadmin 用户和组 (-U: 同时创建同名组, -r: 创建系统用户, -s: 禁止shell登录)
    useradd -r -U -d /home/omadmin -s /sbin/nologin omadmin && \
    # 设置目录所有者
    chown -R omadmin:omadmin /home/omadmin /data

# 从构建阶段复制 jar 包，并直接设置所有者
COPY --from=builder /build/typhoon-api/target/typhoon-api.jar /home/omadmin/program/typhoon-api.jar

# 复制并设置启动脚本
COPY --chown=omadmin:omadmin run.sh /runme.sh
RUN chmod +x /runme.sh

# 优化：切换到非 root 用户执行后续操作
USER omadmin

# 定义进入容器时默认位置
WORKDIR /home/omadmin/program

# 暴露端口
EXPOSE 8556

# 声明运行时需要的环境变量
ENV CD_CM_NACOS_GROUP=
ENV CD_CM_NACOS_NAMESPACE=
ENV CD_CM_NACOS_SERVERS=
ENV CD_SM_NACOS_GROUP=
ENV CD_SM_NACOS_NAMESPACE=
ENV CD_SM_NACOS_SERVERS=
ENV JVM_OPT=

# 优化：添加健康检查
# 假设你的应用有一个 /actuator/health 的健康检查端点
# 如果没有，可以替换为其他能判断服务存活的命令或 URL
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD curl -f http://localhost:8556/healthz || exit 1

# 优化：使用 exec 形式的 ENTRYPOINT，这是最佳实践
ENTRYPOINT ["/bin/bash", "/runme.sh"]
